What is VACUUM
작성일 : 2025.01.05
VACUUM이란?
VACUUM은 PostgreSQL의 핵심 유지보수 기능으로, 데이터베이스의 "쓰레기"를 정리하고 성능을 유지하는 작업입니다.
VACUUM이 필요한 이유
-
MVCC(Multi-Version Concurrency Control) 처리
- PostgreSQL은 데이터를 수정/삭제할 때 기존 데이터를 바로 제거하지 않음
- 트랜잭션의 동시성을 위해 여러 버전의 행을 유지
- 이로 인해 "죽은 튜플(dead tuples)"이 발생
-
디스크 공간 관리
- DELETE된 데이터는 실제로 바로 삭제되지 않음
- UPDATE된 데이터도 새 버전 생성
- 이런 데이터들이 디스크 공간을 계속 차지
VACUUM의 작동 방식
기본 VACUUM
VACUUM my_table;
- 죽은 튜플 식별 및 재사용 가능 표시
- 디스크 공간을 OS에 반환하지는 않음
- 테이블 접근 잠금 없이 수행 가능
VACUUM FULL
VACUUM FULL my_table;
- 테이블을 완전히 새로 작성
- 디스크 공간을 OS에 반환
- 테이블에 대한 배타적 잠금 필요
- 더 많은 시간과 리소스 소요
ANALYZE
VACUUM ANALYZE my_table;
- 테이블의 통계 정보 업데이트
- 쿼리 플래너의 성능 향상에 도움
AUTOVACUUM
PostgreSQL은 자동으로 VACUUM을 수행하는 autovacuum 기능을 제공합니다:
-- autovacuum 설정 확인
SHOW autovacuum_vacuum_threshold;
SHOW autovacuum_vacuum_scale_factor;
주요 설정:
autovacuum_vacuum_threshold: 최소 죽은 튜플 수autovacuum_vacuum_scale_factor: 테이블 크기 대비 비율autovacuum_vacuum_cost_limit: 리소스 사용량 제한
VACUUM 모니터링
현재 상태 확인:
SELECT relname, n_live_tup, n_dead_tup, last_vacuum
FROM pg_stat_user_tables
WHERE schemaname = 'public';
bloat 추정:
SELECT schemaname, tablename,
pg_size_pretty(bloat_size) as bloat_size,
round(bloat_ratio::numeric, 2) as bloat_ratio
FROM pg_stats_pretty
WHERE bloat_ratio > 30;
모범 사례
-
정기적인 VACUUM 실행
- autovacuum 설정 최적화
- 대규모 DELETE/UPDATE 후 수동 VACUUM 고려
-
VACUUM FULL 주의사항
- 유지보수 시간에 실행
- 충분한 디스크 공간 확보
- 백업 준비
-
모니터링 설정
- 죽은 튜플 수 추적
- bloat 수준 관찰
- VACUUM 활동 로깅
요약
VACUUM은 PostgreSQL의 건강한 운영을 위한 필수 작업입니다. 적절한 VACUUM 전략은 다음을 보장합니다:
- 디스 크 공간 효율적 사용
- 쿼리 성능 유지
- 데이터베이스 안정성 확보
효과적인 VACUUM 관리를 위해서는 데이터베이스 사용 패턴을 이해하고, 적절한 모니터링과 유지보수 계획을 수립하는 것이 중요합니다.